package controllers

import (
	"chess/api/models"
)

var (
	起始布局 = [][]string{{"C0", "M0", "X0", "S0", "J0", "S1", "X1", "M1", "C1"},
		{"", "", "", "", "", "", "", ""},
		{"", "P0", "", "", "", "", "", "P1"},
		{"Z0", "", "Z1", "", "Z2", "", "Z3", "", "Z4"},
		{"", "", "", "", "", "", "", ""},
		{"", "", "", "", "", "", "", ""},
		{"z0", "", "z1", "", "z2", "", "z3", "", "z4"},
		{"", "p0", "", "", "", "", "", "p1"},
		{"", "", "", "", "", "", "", ""},
		{"c0", "m0", "x0", "s0", "j0", "s1", "x1", "m1", "c1"}}
	棋子映射 = make(map[string]*models.M棋子, 0)
	棋子坐标 = 二维数组克隆(起始布局)
	走棋记录 = make([][][]string, 0)
	最近走棋 models.M数据
)

func init() {
	开始(起始布局)
}

func 二维数组克隆(arr [][]string) [][]string {
	newArr := make([][]string, len(arr))
	for i, v := range arr {
		newArr[i] = make([]string, len(v))
		for i2, v2 := range v {
			newArr[i][i2] = v2
		}
	}
	return newArr
}

func 走棋(oldX, oldY, newX, newY int) {
	key := 棋子坐标[oldY][oldX]
	newKey := 棋子坐标[newY][newX]
	棋子坐标[oldY][oldX] = ""
	棋子坐标[newY][newX] = key

	棋子映射[key].X = newX
	棋子映射[key].Y = newY

	if newKey != "" {
		delete(棋子映射, newKey)
	}
	走棋记录 = append(走棋记录, 二维数组克隆(棋子坐标))
}

func 悔棋() {
	if len(走棋记录) > 0 {
		走棋记录 = 走棋记录[:len(走棋记录)-1]
	}
	if len(走棋记录) == 0 {
		开始(起始布局)
	} else {
		开始(走棋记录[len(走棋记录)-1])
	}
}

func 开始(布局 [][]string) {
	棋子坐标 = 二维数组克隆(布局)
	最近走棋 = models.M数据{}
	for i1, v1 := range 布局 {
		for i2, v2 := range v1 {
			if v2 != "" {
				棋子映射[v2] = &models.M棋子{X: i2, Y: i1, Key: v2}
			}
		}
	}
}
